package com.wechat.gateway.service;

import cn.hutool.core.util.StrUtil;
import com.wechat.common.security.token.TokenUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Service;

/**
 * Token服务
 */
@Service
@Slf4j
public class TokenService {

    @Autowired
    private TokenUtil tokenUtil;

    /**
     * 从请求中获取用户ID
     *
     * @param request HTTP请求
     * @return 用户ID，如果token无效则返回null
     */
    public Long getUserId(ServerHttpRequest request) {
        String token = extractToken(request);
        if (StrUtil.isEmpty(token)) {
            log.debug("未找到有效的token");
            return null;
        }

        try {
            if (tokenUtil.validateToken(token)) {
                Long userId = tokenUtil.getUserIdFromToken(token);
                log.debug("Token验证成功，用户ID: {}", userId);
                return userId;
            } else {
                log.debug("Token验证失败");
                return null;
            }
        } catch (Exception e) {
            log.warn("Token解析异常: {}", e.getMessage());
            return null;
        }
    }

    /**
     * 从请求中提取Token
     *
     * @param request HTTP请求
     * @return Token字符串
     */
    private String extractToken(ServerHttpRequest request) {
        // 2. 尝试从token头获取
        String tokenHeader = request.getHeaders().getFirst("token");
        if (StrUtil.isNotEmpty(tokenHeader)) {
            // 如果包含Bearer前缀，去除它
            if (tokenHeader.startsWith("Bearer ")) {
                return tokenHeader.substring(7);
            }
            return tokenHeader;
        }
        return null;
    }

    /**
     * 验证Token是否有效
     *
     * @param token JWT Token
     * @return 是否有效
     */
    public boolean validateToken(String token) {
        if (StrUtil.isEmpty(token)) {
            return false;
        }
        try {
            return tokenUtil.validateToken(token);
        } catch (Exception e) {
            log.warn("Token验证异常: {}", e.getMessage());
            return false;
        }
    }

    /**
     * 获取Token中的用户信息
     *
     * @param token JWT Token
     * @return 用户ID
     */
    public Long getUserIdFromToken(String token) {
        try {
            return tokenUtil.getUserIdFromToken(token);
        } catch (Exception e) {
            log.warn("从Token获取用户ID失败: {}", e.getMessage());
            return null;
        }
    }
}
